﻿CREATE SCHEMA pca_pagos;

CREATE SEQUENCE pca_pagos.registro_id;
CREATE TABLE pca_pagos.registros
(
	empresa_id varchar(2) NOT NULL,
	oficina_id varchar(2) NOT NULL,
	registro_id bigint NOT NULL DEFAULT pca_global.fn_pseudo_encrypt_bigint(nextval('pca_pagos.registro_id')::integer),
	grupo_movimiento_id bigint NOT NULL,	
	subgrupo_movimiento_id bigint,
	sesion_id bigint NOT NULL,
	fecha_emision date NOT NULL,
	fecha_vencimiento date NOT NULL,
	fecha_alerta date NOT NULL,
	tipo_comprobante_id varchar(5) NOT NULL,
	strserienumero varchar NOT NULL,
	usuario_registro_id character(36) NOT NULL,
	usuario_actualiza_id character(36),
	fecha_hora_sistema timestamp with time zone NOT NULL DEFAULT now(),
	fecha_hora_actualizacion timestamp with time zone NOT NULL DEFAULT now(),
	medio_pago_id varchar(5),
	detalle varchar(200),--Obcional colocar aqui el numero de cheque por ejemplo o el codigo de operacion de un deposito bancario
	moneda_id varchar(5) NOT NULL,
	monto numeric(11,3) NOT NULL,
	cancelado boolean NOT NULL,
	fecha_hora_cancelacion timestamp with time zone,
	CONSTRAINT registro_pk PRIMARY KEY(empresa_id, oficina_id, registro_id),
	CONSTRAINT grupo_movimiento_fkey FOREIGN KEY(grupo_movimiento_id, empresa_id)
		REFERENCES pca_caja.grupos_movimiento(grupo_movimiento_id, empresa_id) MATCH FULL
		ON UPDATE CASCADE ON DELETE RESTRICT,
	CONSTRAINT subgrupo_movimiento_fkey FOREIGN KEY(subgrupo_movimiento_id, empresa_id)
		REFERENCES pca_caja.subgrupos_movimiento(subgrupo_movimiento_id, empresa_id) MATCH SIMPLE
		ON UPDATE CASCADE ON DELETE RESTRICT,
	CONSTRAINT sesiones_fkey FOREIGN KEY(empresa_id, oficina_id, sesion_id)
		REFERENCES pca_log.sesiones(empresa_id, oficina_id, sesion_id) MATCH FULL
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT tipos_comprobante_fkey FOREIGN KEY(tipo_comprobante_id)
		REFERENCES pca_tablas.tipos_comprobante(codigo) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT usuarios_registro_fkey FOREIGN KEY(usuario_registro_id)
		REFERENCES pca_membership."Users"("pId") MATCH SIMPLE
		ON UPDATE CASCADE ON DELETE CASCADE,
	CONSTRAINT usuarios_actualiza_fkey FOREIGN KEY(usuario_actualiza_id)
		REFERENCES pca_membership."Users"("pId") MATCH SIMPLE
		ON UPDATE CASCADE ON DELETE CASCADE,
	CONSTRAINT tipos_medios_pago_fkey FOREIGN KEY (medio_pago_id)
		REFERENCES pca_tablas.tipos_medios_pago (codigo) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT monedas_fkey FOREIGN KEY(moneda_id)
		REFERENCES pca_tablas.monedas(codigo) MATCH SIMPLE
		ON UPDATE CASCADE ON DELETE RESTRICT,
	CONSTRAINT fecha_vencimiento_chk CHECK(fecha_vencimiento >= fecha_emision),
	CONSTRAINT fecha_alerta_chk CHECK(fecha_alerta >= fecha_emision AND fecha_alerta <= fecha_vencimiento)
);

CREATE OR REPLACE FUNCTION pca_pagos.fn_update_fecha_hora_actualizacion_registro() RETURNS trigger AS
$$
BEGIN
	NEW.fecha_hora_actualizacion := now();
	RETURN NEW;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER tri_update_fecha_hora_actualizacion_registro
	BEFORE UPDATE 
	ON pca_pagos.registros
	FOR EACH ROW
	EXECUTE PROCEDURE pca_pagos.fn_update_fecha_hora_actualizacion_registro();

CREATE OR REPLACE VIEW pca_pagos.vw_registros AS
SELECT
	r.empresa_id,
	r.oficina_id,
	r.registro_id,
	g.tipo_movimiento_id,
	(SELECT nombre FROM pca_caja.tipos_movimiento WHERE tipo_movimiento_id=g.tipo_movimiento_id)AS tipo_movimiento,
	r.grupo_movimiento_id,
	g.codigo AS codigo_grupo_movimiento,
	g.nombre AS nombre_grupo_movimiento,
	r.subgrupo_movimiento_id,
	sg.codigo AS codigo_subgrupo_movimiento,
	sg.nombre AS nombre_subgrupo_movimiento,
	r.sesion_id,
	r.fecha_emision,
	r.fecha_vencimiento,
	r.fecha_alerta,
	r.tipo_comprobante_id,
	(SELECT nombre_corto FROM pca_tablas.tipos_comprobante WHERE codigo=r.tipo_comprobante_id)AS tipo_comprobante,
	r.strserienumero,
	r.usuario_registro_id,
	(SELECT "Nick" FROM pca_membership."UsersProfileData" WHERE "pId"=r.usuario_registro_id)AS usuario_registro,
	r.usuario_actualiza_id,
	(SELECT "Nick" FROM pca_membership."UsersProfileData" WHERE "pId"=r.usuario_actualiza_id)AS usuario_actualiza,
	r.fecha_hora_sistema,
	r.fecha_hora_actualizacion,
	r.medio_pago_id,
	(SELECT nombre_corto FROM pca_tablas.tipos_medios_pago WHERE codigo = r.medio_pago_id) AS medio_pago,
	r.detalle,
	r.moneda_id,
	(SELECT siglas FROM pca_tablas.monedas WHERE codigo = r.moneda_id) AS siglas_moneda,
	r.monto,
	r.cancelado,
	r.fecha_hora_cancelacion
FROM
	pca_pagos.registros r
INNER JOIN
	pca_caja.grupos_movimiento g
ON
	r.grupo_movimiento_id = g.grupo_movimiento_id
LEFT JOIN
	pca_caja.subgrupos_movimiento sg
ON
	r.subgrupo_movimiento_id = sg.subgrupo_movimiento_id;